Spring Security Spring Boot SSO
Spring Boot SSO
上篇文章提到了安全设计,使用Spring Security进行用户验证和权限验证,但一个企业级的应用系统可能存在很多应用系统,每个应用系统都需要设计安全管理,但不可能为每一个应用系统都设计一套安全管理,这样不但耗时耗力,而且要做重复的工作,也不适宜建立统一的用户中心。
可以使用单点登录SSO的方式建立一个登录认证系统,并且实现对用户的统一管理。本章在使用Spring Security安全管理的基础上,再结合OAuth2认证授权协议来实现的,它不但适用于大型的分布式管理系统,也适用于为第三方提供统一的用户管理和认证的平台。
作者给出了一个完整的实例,以模块化的设计方式进行实现,整个demo的代码可以在github上查看。
(https://github.com/mainidear/spring-boot-sso.git)
demo说明
我在本地运行了demo,通过chrome查看了系统间跳转的过程,先说明下模块的划分,然后看下运行效果。
项目 | 工程 | 类型 | 功能 |
---|---|---|---|
数据库管理模块 | mysql | 程序集成 | 数据库管理 |
安全配置模块 | security | 程序集成 | 安全策略配置和权限管理 |
登录认证模块 | login | Web应用 | SSO登录认证(80) |
共享资源模块 | resource | Web应用 | 共享资源(8083) |
客户端应用1 | web1 | Web应用 | 客户端1(8081) |
客户端应用2 | web2 | Web应用 | 客户端2(8082) |
访问首页时,跳转到登录页面,输入正确的账号、密码、验证码。
登录成功后,跳转到首页:
访问web1系统、web2系统时不需要重新登录,会自动登录:
「登录认证模块」主要包括验证用户账号、集成OAuth2服务端端功能。
「安全配置模块」是一个公共模块,集成了SSO客户端的安全策略配置和权限管理功能,供客户端引用。
「数据库管理模块」是一个公共模块,主要提供数据库的访问功能,供其他模块使用。
「共享资源模块」提供了一个简单的公共服务,2个客户端应用可通过spring-cloud-zuul直接调用。
后面会重点介绍下登录认证模块,其他模块比较简单,不再过多介绍。
模块化设计可以提高代码的复用性,避免重复开发,实例中的「数据库管理模块」和「安全配置模块」可以被其他模块共用,减少大部分重复工作。
作者的这种设计方式值得我们学习,在以后的系统设计中,应多借鉴这种方式。
登录认证模块
我画了一个流程图,先了解下用户认证、权限验证的基本过程:
整个处理流程,Spring Security都帮我们自动实现了,我们只需要对账号中心数据源、权限中心数据源进行配置和扩展,另外,可以对登录页面进行扩展,配置权限管理规则、防攻击策略、记住登录状态。
为了实现多个系统只需登录一次,需要集成OAuth2。添加spring-cloud-starter-oauth2依赖,编写一个配置类,继承AuthorizationServerConfigurerAdapter,并声明下@EnableAuthrizationServer来启用OAuth2的认证服务器功能。
OAuth2有很多授权机制,本例中使用authorization_code机制,具体配置就不过多说明了,可以参考下面的几篇文章:
[1]初步理解Spring Security并实践
[2]security OAuth2.0 提供者实现原理
[3]jwt token介绍
[4]security OAuth2.0 jwt完美整合例子